package jmine.tec.rpc.server.representation;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Fábrica de representações.
 * 
 * @author lundberg
 */
public interface RepresentationFactory {

    /**
     * Cria uma representação do objeto, de acordo com o tipo de representação desejada.
     * 
     * @param <R> tipo de representação
     * @param <E> tipo de objeto
     * @param representationClass representationClass
     * @param object object
     * @return representation
     */
    <R, E> R representObject(Class<R> representationClass, E object);

    /**
     * Cria representações dos objetos, de acordo com o tipo de representação desejada.
     * 
     * @param <R> tipo de representação
     * @param <E> tipo de objeto
     * @param representationClass representationClass
     * @param objects objects
     * @return representation
     */
    <R, E> List<R> representObjects(Class<R> representationClass, List<E> objects);

    /**
     * Cria representações dos objetos, de acordo com o tipo de representação desejada.
     * 
     * @param <R> tipo de representação
     * @param <E> tipo de objeto
     * @param representationClass representationClass
     * @param objects objects
     * @return representation
     */
    <R, E> Set<R> representObjects(Class<R> representationClass, Set<E> objects);

    /**
     * Cria representações dos objetos, de acordo com o tipo de representação desejada.
     * 
     * @param <RK> tipo de representação chave
     * @param <RV> tipo de representação valor
     * @param <EK> tipo de objeto chave
     * @param <EV> tipo de objeto valor
     * @param keyClass keyClass
     * @param valueClass valueClass
     * @param objects objects
     * @return representation
     */
    <RK, RV, EK, EV> Map<RK, RV> representObjects(Class<RK> keyClass, Class<RV> valueClass, Map<EK, EV> objects);
}
